package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

func routerGroupMiddleware(doCheck bool) gin.HandlerFunc {
	// 这里写一些比如连接数据库等操作的准备工作
	return func(context *gin.Context) {
		// 这里写具体逻辑
		if doCheck {
			name, ok := context.Get("name") // 在这个中间件接收值
			if ok {
				fmt.Println(name) // lalala
			}
			fmt.Println("执行注册的路由组中间件")
		} else {
			context.Next()
		}
	}
}

func m3(context *gin.Context) {
	fmt.Println("m3 in ...")
	// 计时
	start := time.Now()
	//context.Next() // 调用后续处理函数，不会先执行下面的代码，会先执行其他中间件函数，其他的中间件函数执行完以后，才会继续执行下面的代码
	//context.Abort() // 阻止调用后续处理的中间件，直接接着往下执行,但是下面的本函数的其他代码可以执行完
	cost := time.Since(start)
	fmt.Println("耗时：", cost)
	fmt.Println("m3 out ...")
	context.Set("name", "lalala") // 传值给其他所有要执行的函数都可以接受到该参数
}

func main() {
	r := gin.Default()

	// 写个路由组使用中间件,方式1：
	//xxGroup := r.Group("/xx", routerGroupMiddleware(true))	// 可以注册多个中间件，写多个
	//{
	//	xxGroup.GET("/index", func(context *gin.Context) {
	//		context.JSON(http.StatusOK, gin.H{"msg": "xxGroup"})
	//	})
	//}

	// 写个路由组使用中间件,方式2：
	xx2Group := r.Group("/xx")
	xx2Group.Use(m3, routerGroupMiddleware(true)) // // 可以注册多个中间件，写多个
	{
		xx2Group.GET("/index", func(context *gin.Context) {
			name, ok := context.Get("name") // 在这个中间件接收值
			if ok {
				fmt.Println(name) // lalala
			}
			context.JSON(http.StatusOK, gin.H{"msg": "xx2Group"})
		})
	}

	r.Run(":9090")
}
